// Dieses Skript muss auf ein einfaches (unsichtbares) Grundobjekt. Diesem wird die
// MainCamera untergeordnet. Gezwungen zu Folgen, kann man dann durch die Bewegung
// des unsichtbaren Grundobjekts die Kamera durch die Spielwelt steuern.
// Ein weiterer Vorteil des Grundobjekts bietet die Kollisionserkennung um so
// indirekt die Bewegungsfreiheit der Kamera einschraenken zu koennen.

var Beschleunigung : float = 10000;				// zu vernachlaessigen
var BremsGeschwindigkeit : float = 0.1;			// zu vernachlaessigen

// Hier wird die MainCamera zugewiesen
var CameraObj : GameObject;							// verfolgt das Player Objekt
var MaxBewegungsGeschwindigkeit : float = 25;		// Geschwindigkeitsbegrenzung

//
var HorizontalBewegung : Vector2;					// wird unten wieder separat betrachtet

// Nicht sicher wufuer das gut ist, aber funktioniert auch ohne.
//var MaxSlope : float = 90;

// Hier muss ein LateUpdate hin!
// Das stellt sicher, dass zuerst alle Update-Funktionen ausgefuehrt werden
// und ist wichtig, weil die Kamera ja das Player-Objekt tracked, welches immer
// zuerst geupdatet werden soll.

function Awake () {
		DontDestroyOnLoad (transform.gameObject);		// Kann Probleme geben, wenn dieses Objekt mit geloescht wird
	}

function Update() {

	// Die Bewegung findet nur in 2 Dimensionen statt: X und Z
	HorizontalBewegung = Vector2(rigidbody.velocity.x, rigidbody.velocity.z);

	// Falls Laenge des Vektors groesser der MaxGeschwindigkeit
	if (HorizontalBewegung.magnitude > MaxBewegungsGeschwindigkeit) {
		// Normalized erhaelt die Richtung und setzt die Laenge auf 1
		HorizontalBewegung = HorizontalBewegung.normalized;
		// Auf MaxGeschwindigkeit setzen
		HorizontalBewegung *= MaxBewegungsGeschwindigkeit;
	}

	rigidbody.velocity.x = HorizontalBewegung.x;		// erster Teil des Vector 2
	rigidbody.velocity.z = HorizontalBewegung.y;		// zweiter Teil des Vector 2
	// tatsaechliche Transformation durchfuehren
	transform.rotation = Quaternion.Euler(0, CameraObj.GetComponent(CameraMovement).CurrentYRotation, 0);

	// Kraft auf den Rigidbody ausueben, die in der Bewegung resultiert.
	rigidbody.AddRelativeForce(Input.GetAxis("Horizontal") * Beschleunigung * Time.deltaTime, 0, Input.GetAxis("Vertical") * Beschleunigung * Time.deltaTime);
}
